/*
* Filename
: ipc.h
* copyright
: (C) 张鸿烈
* Function
: 声明IPC机制的函数原型和全局变量
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <signal.h>
#define BUFSZ 256
//进程自定义的键盘中断信号处理函数原型
typedef void (*sighandler_t) (int);
void sigcat(void);
//建立或获取ipc的一组函数的原型说明
/*
* get_ipc_id() 从/proc/sysvipc/文件系统中获取IPC的id号
* pfile: 对应/proc/sysvipc/目录中的IPC文件分别为
* msg-消息队列,sem-信号量,shm-共享内存
* key: 对应要获取的IPC的id号的键值
*/
int get_ipc_id(char *proc_file,key_t key);
/*
 * set_shm函数建立一个具有n个字节 的共享内存区
 * 如果建立成功,返回 一个指向该内存区首地址的指针shm_buf
 * 输入参数:
 * shm_key 共享内存的键值
 * shm_val 共享内存字节的长度
 * shm_flag 共享内存的存取权限
 */
char *set_shm(key_t shm_key,int shm_num,int shm_flag);
/*
 * set_msq函数建立一个//进程自定义的键盘中断信号处理函数
 * 如果建立成功,返回 一个消息队列的标识符msq_id
 * 输入参数:
 * msq_key 消息队列的键值
 * msq_flag 消息队列的存取权限
 */
int set_msq(key_t msq_key,int msq_flag);
/*
 * set_sem函数建立一个具有n个信号灯的信号量
 * 如果建立成功,返回 一个信号灯数组的标识符sem_id
 * 输入参数:
 * sem_key 信号灯数组的键值
 * sem_val 信号灯数组中信号灯的个数
 * sem_flag 信号等数组的存取权限
 */
int set_sem(key_t sem_key,int sem_val,int sem_flag);
/*
 * 信号灯上的PV操作
 * semid:信号灯数组标识符
 * semnum:信号灯数组下标
 * buf:操作信号灯的结构
 */
int P(int sem_id);
int V(int sem_id);
void ipc_init(void);
/*信号灯控制用的共同体*/
typedef union semuns {
int val;
} Sem_uns;
/* 消息结构体*/
typedef struct msgbuf {
long mtype;
char mtext[1];
} Msg_buf;
//生产消费者共享缓冲区即其有关的变量
key_t buff_key;
int buff_num;
char *buff_ptr;
//生产者放产品位置的共享指针
key_t pput_key;
int pput_num;
int *pput_ptr;
//消费者取产品位置的共享指针
key_t cget_key;
int cget_num;
int *cget_ptr;
//生产者有关的信号量
key_t prod_key;
key_t pmtx_key;
int prod_sem;
int pmtx_sem;
//消费者有关的信号量
key_t cons_key;
key_t cmtx_key;
int cons_sem;
int cmtx_sem;
int sem_val;
int sem_flg;
int shm_flg;
int rate;




